package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.security.jwt.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

// 标记该类为一个Spring Service组件，由Spring容器管理
@Service
public class AuthService {
    // 自动注入Spring Security的认证管理器，用于处理用户认证逻辑
    @Autowired
    private AuthenticationManager authenticationManager;

    // 自动注入JWT工具类，用于生成和验证JWT令牌
    @Autowired
    private JwtUtils jwtUtils;

    // 自动注入用户服务，用于处理用户注册等逻辑
    @Autowired
    private UserService userService;

    /**
     * 用户登录认证方法
     *
     * @param username 用户名
     * @param password 用户密码
     * @return 返回生成的JWT令牌
     */
    public String authenticateUser(String username, String password) {
        // 使用用户名和密码构建认证令牌，并通过AuthenticationManager进行认证
        Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));

        // 将认证成功后的Authentication对象设置到Security上下文中，表示当前用户已登录
        SecurityContextHolder.getContext().setAuthentication(authentication);
        // 使用JwtUtils根据认证信息生成JWT令牌并返回
        return jwtUtils.generateJwtToken(authentication);
    }

    /**
     * 用户注册方法
     *
     * @param username 用户名
     * @param email    用户邮箱
     * @param password 用户密码
     * @return 返回注册成功的用户对象
     */
    public User registerUser(String username, String email, String password) {
        // 调用UserService处理用户注册逻辑
        try {
            User user = userService.registerUser(username, email, password);
            return user;
        } catch (Exception e) {
            // 处理异常
            throw new RuntimeException("注册失败", e);
        }

    }
}
